package com.itheima.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.bean.Employee;
import com.itheima.common.R;
import com.itheima.exception.CustomException;
import com.itheima.service.EmployeeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.server.Session;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpSession;
import java.time.LocalDateTime;

@Slf4j
@RequestMapping("/employee")
@RestController
public class EmployeeController {

    @Autowired
    private EmployeeService employeeService;

    //员工登录
    @PostMapping("/login")
    public R<Employee> login(@RequestBody Employee emp, HttpSession session){
        //1.对员工登录输入的密码使用MD5加密
        String password = DigestUtils.md5DigestAsHex(emp.getPassword().getBytes()); //MD5加密的密文密码

        //2.根据用户名查询数据库 返回Employee对象  [调用service]
        LambdaQueryWrapper<Employee> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Employee::getUsername,emp.getUsername());
        Employee employee = employeeService.getOne(wrapper);    //employee对象 是查询数据库得到的 拥有完整的员工信息

        //3.判断Employee对象是否为null
        //4.Employee对象为null 登录失败，表示"用户不存在！"
        if(employee==null){
            return R.error("用户不存在！");
        }

        //5.Employee对象不为null 说明用户存在 比对密码是否一致
        //6.密码不一致 登录失败 表示"用户名密码不匹配！"
        if(!employee.getPassword().equals(password)){
            return R.error("用户名密码不匹配！");
        }

        //7.密码一致 查看员工状态是否已禁用
        //8.禁用 status=0 登录失败 表示"员工已禁用！"
        if(employee.getStatus()==0){
            return R.error("员工已禁用！");
        }

        //9.未禁用 登录成功 9.1：将登录成功的员工id存入到session中 9.2：响应登录成功的员工对象给前端
        session.setAttribute("employee",employee.getId());
        return R.success(employee);
    }

    //退出登录
    @PostMapping("/logout")
    public R<String> logout(HttpSession session){
        //1.清空session中数据
        session.invalidate();  //直接销毁当前用户管理的session对象  因此保存在session中的当前用户数据也被销毁了

        //2.返回退出成功
        return R.success("退出成功！");
    }

    //新增员工
    @PostMapping
    public R<String> add(@RequestBody Employee emp,HttpSession session){
        //1.补齐Employee对象字段信息
        //password 、 status 、 create_time 、update_time 、 create_user 、 update_user
        emp.setPassword(DigestUtils.md5DigestAsHex("123456".getBytes()));
        emp.setStatus(1);

        //使用MyBatisPlus公共字段自动填充替代
        /*emp.setCreateTime(LocalDateTime.now());
        emp.setUpdateTime(LocalDateTime.now());

        Long employeeId = (Long) session.getAttribute("employee");
        emp.setCreateUser(employeeId);
        emp.setUpdateUser(employeeId);*/

        //优化：新增之前判断表中是否存在相同的用户名
        LambdaQueryWrapper<Employee> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Employee::getUsername,emp.getUsername());
        Employee employee = employeeService.getOne(wrapper);

        //当根据用户名查询员工 员工不为null 说明该用户名不可以使用
        if(employee!=null){
            //return R.error("员工已存在！");
            throw new CustomException("员工["+emp.getUsername()+"]已存在！");
        }

        //2.调用service完成新增
        boolean flag = employeeService.save(emp);

        //3.返回新增成功
        return flag?R.success("新增成功！"):R.error("新增失败");
    }

    //分页查询
    @GetMapping("/page")
    public R<Page<Employee>> findPage(@RequestParam(defaultValue="1") Integer page, @RequestParam(defaultValue="10") Integer pageSize, String name){
        //前提工作：配置MyBatisPlus分页拦截器
        //1.接收请求参数
        //2.调用service处理  由于当前功能比较简单，可以直接使用MyBatisPlus在service层提供的通用方法page()完成
        //2.1：创建page对象封装分页参数 当前页码page、每页显示条数pageSize
        Page<Employee> employeePage = new Page<>(page, pageSize);

        //2.2：创建LambdaQueryWrapper对象 封装查询条件 员工姓名name 注意：添加null值处理
        LambdaQueryWrapper<Employee> wrapper = new LambdaQueryWrapper<>();
        wrapper.like(name!=null&&name.length()>0,Employee::getName,name);

        //2.3：调用service中page方法 查询得到分页数据
        employeeService.page(employeePage,wrapper);
        log.info("【employeePage：{}】",employeePage);

        //3.响应json数据  将分页数据封装到R对象中统一格式返回
        return R.success(employeePage);
    }

    //员工启用禁用|员工编辑
    @PutMapping
    public R<String> update(@RequestBody Employee emp,HttpSession session){

        log.info("EmployeeController：线程id={}",Thread.currentThread().getId());

        //员工编辑优化：不能将员工的用户名修改和其他员工的用户名一样 这样会导致用户名重复 出现报错
        //SQL语句: SELECT COUNT( * ) FROM employee WHERE (username = ? AND id <> ?)
        // 查询数据库：统计修改后的用户名在数据库表中其他用户数据上是否存在    根据条件查询统计：用户名username 修改用户id：不是自己
        LambdaQueryWrapper<Employee> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(emp.getUsername()!=null,Employee::getUsername,emp.getUsername());                    //这里不要添加用户名非空判断 因为进行启用禁用员工时 没有传递用户名username
        wrapper.ne(emp.getId()!=null,Employee::getId,emp.getId());      //不是自己  通过这个条件设置 查询其他员工的用户名是否出现和当前修改后的员工用户名重复
        int count = employeeService.count(wrapper);  //通过符合条件的员工个数
        //emp.getUsername()!=null：如果为null表示员工启用禁用 只修改status字段 无法查询判断用户名重复 不为null：员工编辑 查询判断编辑后的用户名是否重复
        if(emp.getUsername()!=null && count>0){
              throw new CustomException("员工用户名["+emp.getUsername()+"]已存在");
        }


        //使用MyBatisPlus公共字段自动填充替代
        /*//1.设置update_time和update_user字段值  记录修改时间和修改人
        emp.setUpdateTime(LocalDateTime.now());
        emp.setUpdateUser((Long) session.getAttribute("employee"));*/

        //2.调用service处理
        boolean flag = employeeService.updateById(emp);

        //3.响应数据
        return flag?R.success("修改成功！"):R.error("修改失败！");
    }

    //数据回显-根据id查询员工信息
    @GetMapping("/{id}")
    public R<Employee> findById(@PathVariable Long id){
        //1.调用service 根据id查询员工信息
        Employee employee = employeeService.getById(id);
        //2.响应数据
        return R.success(employee);
    }


}
